home *** CD-ROM | disk | FTP | other *** search
/ ftp.cs.arizona.edu / ftp.cs.arizona.edu.tar / ftp.cs.arizona.edu / icon / newsgrp / group97b.txt / 000020_icon-group-sender _Thu Jul 10 11:37:00 1997.msg < prev    next >
Internet Message Format  |  2000-09-20  |  2KB

  1. Received: from kingfisher.CS.Arizona.EDU by cheltenham.cs.arizona.edu; Thu, 10 Jul 1997 11:16:32 MST
  2. Received: by kingfisher.CS.Arizona.EDU; (5.65v3.2/1.1.8.2/08Nov94-0446PM)
  3.     id AA26576; Thu, 10 Jul 1997 11:16:32 -0700
  4. Message-Id: <33C49F2C.D97@artaxia.com>
  5. Date: Thu, 10 Jul 1997 11:37:00 +0300
  6. From: Steven Gross <ssgross@artaxia.com>
  7. X-Mailer: Mozilla 3.0 (Win95; I)
  8. Mime-Version: 1.0
  9. To: Icon Group <icon-group@cs.arizona.edu>
  10. Subject: Re: A small puzzle longest common prefix string
  11. Content-Type: text/plain; charset=us-ascii
  12. Content-Transfer-Encoding: 7bit
  13. Errors-To: icon-group-errors@cs.arizona.edu
  14. Status: RO
  15.  
  16. Three lcp routines.  Each is at least five times faster than the
  17. preceeding one, at least for for very long strings.
  18.  
  19. procedure lcp1(s1,s2)
  20. # simplest.  char by char match.  easy to generalize for more strings.
  21.     local i
  22.     i := 1
  23.     while s1[i] == s2[i] do i +:= 1
  24.     return s1[1+:i-1]
  25. end
  26.  
  27. procedure lcp2(s1,s2)
  28. # uses internal string scanning.  doubles chunk scanned each time.
  29.     local i, j
  30.     i := 1;  j := 0;
  31.     while match(s1[j+1 +:i], s2, j+1) do { j+:= i;  i *:= 2 }
  32.     #  or:  while s2 ? (move(j) & =s1[j+1 +: i]) do { j +:= i;  i *:= 2
  33. }
  34.     while j +:= 1 & s1[j] == s2[j]     # check chars from j+1 to i
  35.     return s1[1+:j-1]
  36. end
  37.  
  38. procedure lcp3(s1,s2)
  39. # uses internal screen scanning, recursion to reuse doubling
  40.    return s1[1+:lcph(s1, s2, 0)]
  41. end
  42.  
  43. procedure lcph(s1, s2 ,k)
  44. # on entry, s1[1+:k] == s2[1+:k].
  45. #  returns the number of additional chars that match.
  46.     local i, j
  47.     i := 1;  j := 0;
  48.     while match(s1[k+j+1 +:i], s2, k+j+1) do { j +:= i;  i *:= 2 } 
  49.     if j=0 then return 0 else return j + lcph(s1, s2, k + j)
  50. end
  51.  
  52.